package org.jsola.hr.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.contract.query.AppendixQuery;
import org.jsola.contract.vo.AppendixListVO;
import org.jsola.core.Page;
import org.jsola.core.Result;
import org.jsola.hr.dto.*;
import org.jsola.hr.query.EmpContractQuery;
import org.jsola.hr.query.HrContractQuery;
import org.jsola.hr.vo.*;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 员工合同信息
 *
 * @author zhr
 */
@Api(tags = "hr-员工合同信息")
public interface IEmpContractControllerAPI {

    /**
     * 新增员工合同信息
     *
     * @param empContractAddDTO 员工合同信息新增实体
     * @return 员工合同信息展示对象
     */
    @ApiOperation(value = "新增员工合同信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractAddDTO", dataType = "EmpContractAddDTO", value = "新增员工合同信息", paramType = "body")
    })
    Result<EmpContractVO> save(EmpContractAddDTO empContractAddDTO);


    /**
     * 修改员工合同信息
     *
     * @param empContractUpdateDTO 员工合同信息
     * @return 更新数量
     */
    @ApiOperation(value = "修改员工合同信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractUpdateDTO", dataType = "EmpContractUpdateDTO", value = "修改员工合同信息", paramType = "body")
    })
    Result<Integer> update(EmpContractUpdateDTO empContractUpdateDTO);

    /**
     * 批量编辑、新增、删除员工合同信息
     *
     * @param empContractBatchDTO 要操作的员工合同信息
     * @return 操作之后的全部员工合同信息
     */
    @ApiOperation(value = "批量编辑、新增、删除员工合同信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractBatchDTO", dataType = "EmpContractBatchDTO", value = "要操作的字段数据", paramType = "body")
    })
    Result batch(EmpContractBatchDTO empContractBatchDTO);


    /**
     * 删除单个员工合同信息，彻底删除
     *
     * @param empContractId 员工合同信息id
     * @return 删除数量
     */
    @ApiOperation(value = "删除单个员工合同信息，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractId", dataType = "String", value = "员工合同信息id", paramType = "path")
    })
    Result<Integer> delete(String empContractId);


    /**
     * 批量删除员工合同信息，彻底删除
     *
     * @param empContractIds 员工合同信息id集合
     * @return 删除数量
     */
    @ApiOperation(value = "批量删除员工合同信息，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractIds", dataType = "String[]", value = "员工合同信息id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> deleteBatch(String[] empContractIds);


    /**
     * 根据员工合同信息id查询员工合同信息详情
     *
     * @param empContractId 员工合同信息id
     * @return 员工合同信息详情
     */
    @ApiOperation(value = "根据员工合同信息id查询员工合同信息详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractId", dataType = "String", value = "员工合同信息id", paramType = "path")
    })
    Result<EmpContractVO> findById(String empContractId);


    /**
     * 查询员工合同信息
     *
     * @param empContractQuery 员工合同信息查询参数
     * @return page
     */
    @ApiOperation(value = "查询员工合同信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractQuery", dataType = "EmpContractQuery", value = "员工合同信息查询参数", paramType = "query")
    })
    Result<List<EmpContractListVO>> listAll(EmpContractQuery empContractQuery);


    /**
     * 分页查询员工合同信息
     *
     * @param empContractQuery 员工合同信息查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询员工合同信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractQuery", dataType = "EmpContractQuery", value = "员工合同信息查询参数", paramType = "query")
    })
    Result<Page<EmpContractListVO>> page(EmpContractQuery empContractQuery);

    /**
     * 分页查询合同
     *
     * @param hrContractQuery 查询条件
     * @return 合同列表信息
     */
    @ApiOperation(value = "分页查询合同")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "hrContractQuery", dataType = "HrContractQuery", value = "查询条件", paramType = "query")
    })
    Result<Page<HrContractListVO>> selectContractPage(HrContractQuery hrContractQuery);

    /**
     * 分页查询合同(POST请求)
     *
     * @param hrContractQuery 查询条件
     * @return 合同列表信息
     */
    @ApiOperation(value = "分页查询合同(POST请求)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "hrContractQuery", dataType = "HrContractQuery", value = "查询条件", paramType = "query")
    })
    Result<Page<HrContractListVO>> selectContractPagePost(HrContractQuery hrContractQuery);


    @ApiOperation(value = "发起模板签署")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "hrPublishSignDTO", dataType = "HrPublishSignDTO", value = "发起模板签署对象", paramType = "body")
    })
    Result<String> publishTemplateSign(HrPublishSignDTO hrPublishSignDTO);

    /**
     * 查询合同文件
     *
     * @param appendixQuery 合同文件查询参数
     * @return page
     */
    @ApiOperation(value = "查询合同文件")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "appendixQuery", dataType = "AppendixQuery", value = "合同文件查询参数", paramType = "query")
    })
    Result<List<AppendixListVO>> selectAppendix(AppendixQuery appendixQuery);

    @ApiOperation(value = "个人签署发送验证码")
    Result<Boolean> sendContractCode();


    /**
     * 导入excel
     *
     * @param file 上传的文件
     * @return 导入成功数量
     */
    @ApiOperation(value = "导入excel")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "文件，Content-Type需要设置为multipart/form-data", paramType = "form"),
            @ApiImplicitParam(name = "companyId", dataType = "AppendixQuery", value = "公司Id", paramType = "path"),
    })
    Result<EmpContractExcelVO> importFile(MultipartFile file, String companyId);

    /**
     * 获取某员工某种类型的所有合同信息
     *
     * @param empId 员工id
     * @param type  类型
     * @return 某员工某种类型的所有合同信息
     */
    @ApiOperation(value = "获取某员工某种类型的所有合同信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empId", value = "员工id", paramType = "query"),
            @ApiImplicitParam(name = "type", value = "类型", paramType = "query"),
    })
    Result<EmpContractVO> listByType(String empId, String type);

    /**
     * 分页查询员工全部合同信息（电子、纸质都查询）
     *
     * @param empContractQuery 员工合同信息查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询员工全部合同信息（电子、纸质都查询）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractQuery", dataType = "EmpContractQuery", value = "员工合同信息查询参数", paramType = "query")
    })
    Result<Page<HrContractVO>> pageElectronicAndPaper(EmpContractQuery empContractQuery);

    /**
     * 分页查询员工全部合同信息（电子、纸质都查询，post请求）
     *
     * @param empContractQuery 员工合同信息查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询员工全部合同信息（电子、纸质都查询，post请求）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractQuery", dataType = "EmpContractQuery", value = "员工合同信息查询参数", paramType = "query")
    })
    Result<Page<HrContractVO>> pageElectronicAndPaperPost(EmpContractQuery empContractQuery);


    /**
     * 分页查询员工全部合同信息（电子、纸质都查询，post请求） 小程序使用 排序规则为剩余有效天数 0》1》99》-1》-99》未填写
     *
     * @param empContractQuery 员工合同信息查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询员工全部合同信息（电子、纸质都查询，post请求）小程序使用 排序规则为剩余有效天数 0》1》99》-1》-99》未填写")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractQuery", dataType = "EmpContractQuery", value = "员工合同信息查询参数", paramType = "query")
    })
    Result<Page<HrContractVO>> pageElectronicAndPaperForXcx(EmpContractQuery empContractQuery);


    /**
     * 查询员工各种合同数量（电子、纸质都查询）
     *
     * @param empContractQuery 员工合同信息查询参数
     * @return page
     */
    @ApiOperation(value = "查询员工各种合同数量（电子、纸质都查询）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractQuery", dataType = "EmpContractQuery", value = "员工合同信息查询参数", paramType = "query")
    })
    Result<HrContractCountVO> selectElectronicAndPaperNumber(EmpContractQuery empContractQuery);

    /**
     * 查询员工各种合同数量（电子、纸质都查询，post请求）
     *
     * @param empContractQuery 员工合同信息查询参数
     * @return page
     */
    @ApiOperation(value = "查询员工各种合同数量（电子、纸质都查询，post请求）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empContractQuery", dataType = "EmpContractQuery", value = "员工合同信息查询参数", paramType = "query")
    })
    Result<HrContractCountVO> selectElectronicAndPaperNumberPost(EmpContractQuery empContractQuery);


    /**
     * 导出全部合同列表
     *
     * @param empContractQuery 查询参数
     * @return 合同列表
     */
    @ApiOperation(value = "导出全部合同列表")
    @ApiImplicitParam(name = "empContractQuery", dataType = "EmpContractQuery", value = "导出查询参数", paramType = "body")
    ResponseEntity<Resource> exportAllContract(EmpContractQuery empContractQuery);


    /**
     * 批量删除员工合同信息，彻底删除(全部合同页面使用：电子合同、纸质合同混在一起删除)
     *
     * @param empAllContractDeleteDTOS 员工合同信息id集合
     * @return 删除数量
     */
    @ApiOperation(value = "批量删除员工合同信息，彻底删除(全部合同页面使用：电子合同、纸质合同混在一起删除)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empAllContractDeleteDTOS", dataType = "EmpAllContractDeleteDTO[]", value = "员工合同信息id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> deleteBatchElectronicAndPaperNumber(EmpAllContractDeleteDTO[] empAllContractDeleteDTOS);


}

